package com.freemalll.common.core.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.freemalll.common.core.web.page.PageDomain;
import com.freemalll.common.core.web.page.TableDataInfo;

/**
 * MyBatis-Plus 分页工具类
 * 
 * @author freemalll
 */
public class MyBatisPlusPageUtils
{
    /**
     * 创建 MyBatis-Plus 分页对象
     * 
     * @param <T> 实体类型
     * @return 分页对象
     */
    public static <T> Page<T> getPage()
    {
        PageDomain pageDomain = PageDomain.getCurrentPage();
        if (pageDomain == null)
        {
            return new Page<>(1, 10);
        }
        
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        
        if (pageNum == null || pageNum < 1) {
            pageNum = 1;
        }
        if (pageSize == null || pageSize < 1) {
            pageSize = 10;
        }
        if (pageSize > 1000) {
            pageSize = 1000; // 限制最大页面大小
        }
        
        return new Page<>(pageNum, pageSize);
    }

    /**
     * 将 MyBatis-Plus 分页结果转换为 TableDataInfo
     * 
     * @param page MyBatis-Plus 分页结果
     * @return TableDataInfo
     */
    public static <T> TableDataInfo getDataTable(IPage<T> page)
    {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(200);
        rspData.setRows(page.getRecords());
        rspData.setMsg("查询成功");
        rspData.setTotal(page.getTotal());
        return rspData;
    }

    /**
     * 设置分页参数到 ThreadLocal
     * 
     * @param pageNum 页码
     * @param pageSize 每页大小
     */
    public static void setPage(Integer pageNum, Integer pageSize)
    {
        PageDomain.setCurrentPageNum(pageNum);
        PageDomain.setCurrentPageSize(pageSize);
    }

    /**
     * 设置分页参数到 ThreadLocal
     * 
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @param orderBy 排序字段
     */
    public static void setPage(Integer pageNum, Integer pageSize, String orderBy)
    {
        PageDomain.setCurrentPageNum(pageNum);
        PageDomain.setCurrentPageSize(pageSize);
        PageDomain.setCurrentOrderBy(orderBy);
    }

    /**
     * 清理分页参数
     */
    public static void clearPage()
    {
        PageDomain.clearPage();
    }
}